/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mindbox.mueblesalpes.presentacion.compras;

import com.mindbox.mueblesalpes.negocio.entity.Entidad;
import com.mindbox.mueblesalpes.negocio.entity.FormaPago;
import com.mindbox.mueblesalpes.negocio.persistence.ListadoProductosLocal;
import com.mindbox.mueblesalpes.presentacion.sesion.SessionInfo;
import com.mindbox.mueblesalpes.presentacion.sesion.SessionWeb;
import com.mindbox.mueblesalpes.presentacion.utils.Mensajes;
import com.mindbox.mueblesalpes.presentacion.utils.ReglasNavegacion;
import com.mindbox.mueblesalpes.presentacion.utils.UtilidadesSesion;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

/**
 * Backing Bean para la pagina de comprar.xhtml
 * @author jsanchez
 */
public class PagarBackingBean {

    @EJB
    private ListadoProductosLocal listadoProductos;
    private String idFormaPago;
    private List<SelectItem> formasPago;
    private String idEntidadBancaria;
    private List<SelectItem> entidadesBancaria;
    private String idEntidadTarjeta;
    private List<SelectItem> entidadesTarjeta;
    private boolean validaSesion;
    private boolean combo1;
    private boolean combo2;
    private boolean comprado;
    private SessionWeb sesionWeb;
    private SessionInfo sesionInfo;

    private List<FormaPago> formasPagoObj;
    private List<Entidad> entidadesBancariaObj;
    private List<Entidad> entidadesTarjetaObj;

    /** Creates a new instance of PagarBackingBean */
    public PagarBackingBean() {
        sesionInfo = new SessionInfo();
        this.sesionWeb = UtilidadesSesion.getSessionWeb(FacesContext.getCurrentInstance());
        this.validaSesion = UtilidadesSesion.verificarSesionInfoAlPagar(sesionInfo, sesionWeb);
    }

    @PostConstruct
    public void init() {
        if (sesionInfo != null) {

            //Combo para las formas de pago.
            this.formasPago = new ArrayList<SelectItem>();
            this.formasPago.add(new SelectItem("", ""));
            this.formasPagoObj = this.listadoProductos.getFormasPago();
            for (FormaPago forma : this.formasPagoObj) {
                this.formasPago.add(new SelectItem(forma.name(), forma.toString()));
            }

            //Combo para las entidades bancarias.
            this.entidadesBancaria = new ArrayList<SelectItem>();
            this.entidadesBancaria.add(new SelectItem("", ""));
            this.entidadesBancariaObj = this.listadoProductos.getEntidadesBancarias();
            for (Entidad entidad : this.entidadesBancariaObj) {
                this.entidadesBancaria.add(new SelectItem(entidad.getId(), entidad.getNombre()));
            }

            //Combo para las entidades bancarias.
            this.entidadesTarjeta = new ArrayList<SelectItem>();
            this.entidadesTarjeta.add(new SelectItem("", ""));
            this.entidadesTarjetaObj = this.listadoProductos.getEntidadesTarjetaCredito();
            for (Entidad entidad : this.entidadesTarjetaObj ) {
                this.entidadesTarjeta.add(new SelectItem(entidad.getId(), entidad.getNombre()));
            }
        }
    }

    /**
     * Metodo que se ejecuta al realizar un cambio de la forma de pago.
     * @return
     */
    public String cambioFormaPago() {
        this.combo1 = false;
        this.combo2 = false;
        if (this.idFormaPago != null && this.idFormaPago.trim().length() > 0) {
            if (this.idFormaPago.equals(FormaPago.ENTIDAD_BANCARIA.name())) {
                this.combo1 = true;
            } else if (this.idFormaPago.equals(FormaPago.TARJETA_CREDITO.name())) {
                this.combo2 = true;
            }
        }
        return null;
    }

    /**
     * Metodo que se ejecuta al realizar un clic sobre cancelar
     * @return
     */
    public String cancelar() {
        if (sesionInfo != null && sesionWeb != null) {
            this.sesionWeb.cancelarPago();
        }
        return this.cerrar();
    }

    /**
     * Metodo que se ejecuta al realizar un clic sobre terminar compra
     * @return
     */
    public String terminarCompra() {
        if (sesionInfo != null && sesionWeb != null) {
            if (validarCamposRequeridos()) {
                this.setComprado(true);
                this.sesionWeb.getVenta().setFormaPago(
                        this.formasPagoObj.get(
                            this.formasPagoObj.indexOf(FormaPago.valueOf(idFormaPago))
                            ));
                if(this.combo1)//Bancaria
                    this.sesionWeb.getVenta().setEntidad(
                            this.entidadesBancariaObj.get(
                                this.entidadesBancariaObj.indexOf(new Entidad(this.idEntidadBancaria,""))));
                else if(this.combo2)//Tarjeta
                    this.sesionWeb.getVenta().setEntidad(
                            this.entidadesTarjetaObj.get(
                                this.entidadesTarjetaObj.indexOf(new Entidad(this.idEntidadTarjeta,""))));
                sesionWeb.realizarPago();
            } else {
                this.setComprado(false);
            }
        }
        return "";
    }

    /**
     * Metodo que se ejecuta al realizar un clic sobre cancelar
     * @return
     */
    public String terminar() {
        if (sesionInfo != null && sesionWeb != null) {
            this.sesionWeb.terminarPago();
        }
        return this.cerrar();
    }

    /**
     * Metodo que se ejecuta al terminar la compra.
     * @return
     */
    public String cerrar() {
        return ReglasNavegacion.inicio.name();
    }

    /**
     * Valida los campos requeridos en el formulario.
     * @return booelan
     */
    private boolean validarCamposRequeridos() {
        if (cadenaVacia(this.idFormaPago)) {
            //TODO msg en el properties
            Mensajes.asignarMensajeError("Debe seleccionar la forma de pago");
        } else {
            if (this.idFormaPago.equals(FormaPago.ENTIDAD_BANCARIA.name())) {
                if (cadenaVacia(idEntidadBancaria)) {
                    //TODO msg en el properties
                    Mensajes.asignarMensajeError("Debe seleccionar la entidad bancaria");
                } else {
                    return true;
                }
            } else if (this.idFormaPago.equals(FormaPago.TARJETA_CREDITO.name())) {
                if (cadenaVacia(idEntidadTarjeta)) {
                    //TODO msg en el properties
                    Mensajes.asignarMensajeError("Debe seleccionar la tarjeta de credito");
                } else if (cadenaVacia(sesionWeb.getVenta().getDatosTarjeta().getNombresApellidos())) {
                    //TODO msg en el properties
                    Mensajes.asignarMensajeError("Debe diligenciar los nombres y apellidos");
                } else if (cadenaVacia(sesionWeb.getVenta().getDatosTarjeta().getNumeroTarjeta())) {
                    //TODO msg en el properties
                    Mensajes.asignarMensajeError("Debe diligenciar el número de la tarjeta de crédito");
                } else if (cadenaVacia(sesionWeb.getVenta().getDatosTarjeta().getCodigoSeguridad())) {
                    //TODO msg en el properties
                    Mensajes.asignarMensajeError("Debe diligenciar el código de seguridad");
                } else if (sesionWeb.getVenta().getDatosTarjeta().getFechaExpiracion() == null) {
                    //TODO msg en el properties
                    Mensajes.asignarMensajeError("Debe diligenciar la fecha de expiración");
                } else {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * Indica si una cadena es vacía.
     * @param cadena
     * @return
     */
    public static boolean cadenaVacia(String cadena) {
        return cadena == null || cadena.trim().length() <= 0;
    }

    /**
     * Obtiene si el se debe mostrar el combo1
     * @return boolean
     */
    public boolean isCombo1() {
        return combo1;
    }

    /**
     * Coloca el valor para saber si el combo1 se mostrará
     * @param combo1
     */
    public void setCombo1(boolean combo1) {
        this.combo1 = combo1;
    }

    /**
     * Obtiene si el se debe mostrar el combo1
     * @return boolean
     */
    public boolean getCombo1() {
        return combo1;
    }

    /**
     * Obtiene si el se debe mostrar el combo2
     * @return boolean
     */
    public boolean isCombo2() {
        return combo2;
    }

    /**
     * Obtiene si el se debe mostrar el combo2
     * @return boolean
     */
    public boolean getCombo2() {
        return combo2;
    }

    /**
     * Coloca el valor para saber si el combo2 se mostrará
     * @param combo1
     */
    public void setCombo2(boolean combo2) {
        this.combo2 = combo2;
    }

    /**
     * Obtiene la lista de entidades bancarias
     * @return List<SelectItem>
     */
    public List<SelectItem> getEntidadesBancaria() {
        return entidadesBancaria;
    }

    /**
     * Coloca la lista de entidades bancarias
     * @param entidadesBancaria
     */
    public void setEntidadesBancaria(List<SelectItem> entidadesBancaria) {
        this.entidadesBancaria = entidadesBancaria;
    }

    /**
     * Obtiene las entidades de tarjeta de credito
     * @return List<SelectItem>
     */
    public List<SelectItem> getEntidadesTarjeta() {
        return entidadesTarjeta;
    }

    /**
     * Coloca las entidad de la tarjeta de credito
     * @param entidadesTarjeta
     */
    public void setEntidadesTarjeta(List<SelectItem> entidadesTarjeta) {
        this.entidadesTarjeta = entidadesTarjeta;
    }

    /**
     * Obtiene las formas de pago.
     * @return List<SelectItem>
     */
    public List<SelectItem> getFormasPago() {
        return formasPago;
    }

    /**
     * Coloca las formas de pago.
     * @param formasPago
     */
    public void setFormasPago(List<SelectItem> formasPago) {
        this.formasPago = formasPago;
    }

    /**
     * Obtiene el id de la entidad bancaria actual seleccionada.
     * @return String
     */
    public String getIdEntidadBancaria() {
        return idEntidadBancaria;
    }

    /**
     * Coloca el id de la entidad bancaria actual seleccionada.
     * @param idEntidadBancaria
     */
    public void setIdEntidadBancaria(String idEntidadBancaria) {
        this.idEntidadBancaria = idEntidadBancaria;
    }

    /**
     * Obtiene el id de la entidad tarjeta actual seleccionada.
     * @return String
     */
    public String getIdEntidadTarjeta() {
        return idEntidadTarjeta;
    }

    /**
     * Coloca el id de la entidad tarjeta actual seleccionada.
     * @param idEntidadTarjeta
     */
    public void setIdEntidadTarjeta(String idEntidadTarjeta) {
        this.idEntidadTarjeta = idEntidadTarjeta;
    }

    /**
     * Obtiene el id de la forma de pago actual seleccionada.
     * @return String
     */
    public String getIdFormaPago() {
        return idFormaPago;
    }

    /**
     * Coloca el id de la forma de pago actual seleccionada.
     * @param idFormaPago
     */
    public void setIdFormaPago(String idFormaPago) {
        this.idFormaPago = idFormaPago;
    }

    /**
     * Indica si la session en valida
     * @return boolean
     */
    public boolean isValidaSesion() {
        return validaSesion;
    }

    /**
     * Coloca si la session en valida
     * @param validaSesion
     */
    public void setValidaSesion(boolean validaSesion) {
        this.validaSesion = validaSesion;
    }

    /**
     * Indica si ya fue comprado
     * @return boolean
     */
    public boolean isComprado() {
        return comprado;
    }

    /**
     * Coloca si fue comprado
     * @param comprado
     */
    public void setComprado(boolean comprado) {
        this.comprado = comprado;
    }
}